package br.com.saeng2D.superficie.select;

import java.awt.event.MouseEvent;

import br.com.saeng2D.formulario.FormularioPrincipal;
import br.com.saeng2D.objeto.AbstratoObjeto;
import br.com.saeng2D.objeto.linha.Linha;
import br.com.saeng2D.objeto.ponto.Ponto;
import br.com.saeng2D.superficie.Superficie;
import br.com.saeng2D.superficie.manipl.AbstratoManipulador;
import br.com.saeng2D.util.R2D;

//Seleciona um determinado objeto da superfície de desenho
public class SelecionaObjetos extends AbstratoManipulador {
	private RetanguloSelecao areaSelecao;

	//Construtor
	public SelecionaObjetos(Superficie superficie) {
		super(superficie);
	}

	//Seleciona objetos
	public void mouseClicked(MouseEvent e) {
		int x = e.getX();
		int y = e.getY();
		for (AbstratoObjeto objeto : superficie.getObjetos()) {
			if(objeto instanceof RetanguloSelecao) {
				continue;
			}
			if(objeto.estarSob(x, y)) {
				objeto.setSelecionado(true);
			}
			if(objeto instanceof Linha) {
				Linha linha = (Linha) objeto;
				Ponto ponto1 = linha.getPonto1();
				Ponto ponto2 = linha.getPonto2();
				if(ponto1.estarSob(x, y)) {
					ponto1.setSelecionado(true);
				} 
				if(ponto2.estarSob(x, y)) {
					ponto2.setSelecionado(true);
				}
			}
			if(objeto instanceof Linha && objeto.isSelecionado()) {
				FormularioPrincipal.atualizarLabelStatus((Linha)objeto);
			}
		}
	}

	public void mouseDragged(MouseEvent e) {
		atualizarTitulo(e);
		areaSelecao.reformular(e.getX(), e.getY());
		superficie.repaint();
	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mouseMoved(MouseEvent e) {
		atualizarTitulo(e);
	}

	//Limpa todos os objetos selecionados
	//Criar uma nova area de selecao
	public void mousePressed(MouseEvent e) {
		for (AbstratoObjeto objeto : superficie.getObjetos()) {
			if(objeto instanceof RetanguloSelecao) {
				continue;
			}
			objeto.setSelecionado(false);
			if(objeto instanceof Linha) {
				Linha linha = (Linha) objeto;
				Ponto ponto1 = linha.getPonto1();
				Ponto ponto2 = linha.getPonto2();
				ponto1.setSelecionado(false);
				ponto2.setSelecionado(false);
			}
		}
		areaSelecao = new RetanguloSelecao(e.getX(), e.getY());
		superficie.adicionarObjeto(areaSelecao);
	}

	//Seleciona objetos
	public void mouseReleased(MouseEvent e) {
		R2D areaSelecaoCriada = new R2D(areaSelecao.getX(), areaSelecao.getY(), areaSelecao.getLargura(), areaSelecao.getAltura());
		if(areaSelecaoCriada.getLargura() > 0 && areaSelecaoCriada.getAltura() > 0) {
			for (AbstratoObjeto objeto : superficie.getObjetos()) {
				if(objeto instanceof RetanguloSelecao) {
					continue;
				}
				R2D areaObjeto = objeto.getArea();
				if(areaSelecaoCriada.contem(areaObjeto)) {
					objeto.setSelecionado(true);
				}
				if(objeto instanceof Linha) {
					Linha linha = (Linha) objeto;
					Ponto ponto1 = linha.getPonto1();
					Ponto ponto2 = linha.getPonto2();
					if(areaSelecaoCriada.contem(ponto1.getX(), ponto1.getY())) {
						ponto1.setSelecionado(true);
					} 
					if(areaSelecaoCriada.contem(ponto2.getX(), ponto2.getY())) {
						ponto2.setSelecionado(true);
					}
				}
			}
		}
		superficie.excluirObjeto(areaSelecao);
	}

	public void antesSubstituicao() {
	}

	public void aposSubstituicao() {
	}
}